package com.t.bricks.bussiness.controller.bridge;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.service.bridge.UserAndRightService;
import com.t.bricks.model.MsgEmity;

/**
 * 用户权限验证,非内部请求的访问都需要进行
 * @author huangxinbian
 */
@ConditionalOnMissingClass("com.t.bricks.bussiness.controller.rightmanage.RightManageController")
@RestController
@Api(value="用户权限桥接服务", tags={"桥接服务-用户权限桥接操作接口"})
public class UserAndRightController {

	@Autowired
	private UserAndRightService userAndRightServer;

	/**
	 * 清理指定用户的缓存
	 * @param sUser 用户编号
	 * @return
	 */
	//[start]
	@ApiOperation(value="清理指定用户的缓存", notes="如果参数为空则删除所有用户缓存")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sLoginId", value="用户编号", dataType="String", paramType="query", required=false)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="没有启用缓存"),
		@ApiResponse(code=8002, message="试图删除所有用户的'关联权限信息'缓存失败"),
		@ApiResponse(code=8003, message="试图删除用户的'关联权限信息'缓存失败"),
		@ApiResponse(code=8004, message="8004~8998其它操作的异常错误"),
		@ApiResponse(code=8999, message="删除缓存成功")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/user/and/right/clear/cache")
	public MsgEmity clearCache(String sLoginId) {
		return userAndRightServer.clearCache(sLoginId);
	}
	
	/**
	 * 根据用户取权限标识字符串(一个权限标识代表了多个可访问的url路径)
	 * 不用判断请求用户是谁,因为其它人获取信息后没用,权限校验会在每次进行具体操作时进行再次判断
	 * @param sUserId
	 * @return
	 */
	//[start]
	@ApiOperation(value="根据用户取权限标识字符串", notes="一个权限标识代表了多个可访问的url路径")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sUserId", value="用户编号", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|Json数据对象集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="参数用户编号为空"),
		@ApiResponse(code=8100, message="未查询到用户相关权限信息"),
		@ApiResponse(code=8004, message="8004~8998其它操作的异常错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/user/and/right/find/english")
	public MsgEmity findEnglishByUserId(String sUserId) {
		return userAndRightServer.findEnglishByUserId(sUserId);
	}

	/**
	 * 验证指定用户是否有访问指定url的权限(给内部拦截器用,直接返回Boolean)
	 * @param sUserId
	 * @param url
	 * @return
	 */
	//[start]
	@ApiOperation(value="验证指定用户是否有访问指定url的权限", notes="只给内部拦截器用,直接返回Boolean")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sUserId", value="用户编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="url", value="检验地址", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="布尔值"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="待验证的用户编号为空"),
		@ApiResponse(code=8002, message="待验证的访问权限为空"),
		@ApiResponse(code=8003, message="没有权限"),
		@ApiResponse(code=8100, message="未查询到用户相关权限信息"),
		@ApiResponse(code=8004, message="8004~8998其它操作的异常错误"),
		@ApiResponse(code=8999, message="有权限")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/user/and/right/check")
	public boolean checkUrlRight(String sUserId, String url) {
		return userAndRightServer.checkUrlRight(sUserId, url);
	}
	
	/**
	 * 根据用户查询用户所拥有的权限编号集合
	 * @param sUserId
	 * @return
	 */
	//[start]
	@ApiOperation(value="根据用户查询用户所拥有的权限编号集合")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sUserId", value="用户编号", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|字符串集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="用户编号为空"),
		@ApiResponse(code=7001, message="查询失败"),
		@ApiResponse(code=8004, message="7002~8998其它操作的异常错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/user/and/right/find/rightid")
	public MsgEmity findRightId(String sUserId) {
		return userAndRightServer.findRightId(sUserId);
	}
	
	/**
	 * 根据用户查询用户所拥有的权限的最后更新时间
	 * @param sUserId
	 * @return
	 */
	//[start]
	@ApiOperation(value="根据用户查询用户所拥有的权限的最后更新时间")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sUserId", value="用户编号", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值|字符串集合}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性，如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="用户编号为空"),
		@ApiResponse(code=7001, message="查询失败"),
		@ApiResponse(code=8004, message="7002~8998其它操作的异常错误")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/user/and/right/lasttime")
	public MsgEmity lastTime(String sUserId) {
		return userAndRightServer.lastTime(sUserId);
	}

}
